﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Linq.Dynamic;
using System.Web;
using System.Web.Mvc;
using ChoViet.CMS.Components;
using ChoViet.CMS.Properties;
using ChoViet.CMS.ViewModels;
using ChoViet.Lib.Common;
using ChoViet.Lib.Mail;
using ChoViet.Model;
using MVCMessage;
using ChoViet.Lib.Helpers;
using ChoViet.Lib.Paging;
using MyUtility;
namespace ChoViet.CMS.Controllers
{
    public class UserController : BaseController
    {
        [RoleHelper(Roles = RoleSystem.User)]
        public ActionResult IndexCms(int? page)
        {
            ChoVietDataContext eDataContext = new ChoVietDataContext();
            if (!page.HasValue) page = 1;
            UserIndexCmsViewModel param = new UserIndexCmsViewModel();
            try
            {
                string order = UserState.getUserStateFromRequest("User.order", "order", "ID").ToString();
                string orderDir = UserState.getUserStateFromRequest("User.orderDir", "orderDir", "desc").ToString();
                param.OperationYN = Convert.ToInt32(UserState.getUserStateFromRequest("User.OperationYN", "OperationYN", 0));
                param.ActiveYN= Convert.ToInt32(UserState.getUserStateFromRequest("User.ActiveYN", "ActiveYN", 0));
                param.Keyword= UserState.getUserStateFromRequest("User.Keyword", "Keyword", "").ToString();
                int pageSize = int.Parse(UserState.getUserStateFromRequest("User.pageSize", "PageSize", 20).ToString());

                param.ListActiveYN = Utils.StringToDictionary(Settings.Default.UserActiveYNStatus.ToString(), ",");
                param.ListOperation = Utils.StringToDictionary(Settings.Default.UserOperationStatus.ToString(), ",");
                param.Users = eDataContext.Users
                                   .Where(cm => (param.OperationYN == 1 ? cm.OperationYN == true : true) && (param.OperationYN == 2 ? (cm.OperationYN == false || cm.OperationYN == null) : true)&&
                                   (param.ActiveYN == 1 ? cm.ActiveYN == true : true) && (param.ActiveYN == 2 ? (cm.ActiveYN == false || cm.ActiveYN == null) : true)&&
                                   (string.IsNullOrEmpty(param.Keyword) ? true :
                                                (cm.ID.ToString().ToLower().Contains(param.Keyword.ToLower().Trim())
                                                ) || (cm.Email.ToString().ToLower().Contains(param.Keyword.ToLower().Trim())) ||
                                                (cm.DisplayName.ToString().ToLower().Contains(param.Keyword.ToLower().Trim())) ||
                                                (cm.Phone.ToString().ToLower().Contains(param.Keyword.ToLower().Trim())) ||
                                                (cm.UserName.ToLower().Contains(param.Keyword.ToLower().Trim()))))
                                   .OrderBy(string.Format("{0} {1}", order, orderDir))
                                   .ToPagedList(page.Value - 1, pageSize);

                ViewData["orderDir"] = orderDir;
                ViewData["order"] = order;

                return View(param);
            }
            catch (Exception ex)
            {
                Messages.AddErrorFlashMessage("Phát sinh lỗi:");
                Messages.AddFlashException(ex);
                return View(param);
            }
        }
        public ActionResult Usermanage()
        {
            var temp = new BaseAuthentication();
            var param = new UsermanageViewModel();
            param.User = temp.CurrentUser;
            param.Ads = AdManager.GetListAdByUser(temp.CurrentUser);
            return View(param);
        }
        public ActionResult Profile()
        {
            return View();
        }
        [HttpPost]
        public ActionResult LogIn()
        {
            ChoVietDataContext eDataContext = new ChoVietDataContext();
            var user = Request["modlgn_username"];
            var pas = Request["modlgn_passwd"];
            var url = Request["url"];
            var currentUser = eDataContext.Users.Where(e => e.UserName == user && e.ActiveYN == true && e.OperationYN == true).FirstOrDefault();
            if (currentUser != null)
            {
                var currentpass = Utils.DecryptFromMD5(currentUser.PassWord, currentUser.RandomKey);
                if (currentpass == pas)
                {
                    var temp = new BaseAuthentication();
                    temp.Login(user);
                    Messages.AddFlashMessage("Thông báo: 'Bạn đã đăng nhập hệ thống thành công'");
                    currentUser.LastLogInTime = DateTime.Now;
                    eDataContext.SubmitChanges();
                    return Redirect(url);
                }
                else
                {
                    Messages.AddErrorFlashMessage("Thông báo: 'Mật khẩu bạn nhập không đúng'");
                    Messages.AddErrorFlashMessage("Vui lòng xem lại mật khẩu");
                    return Redirect(url);
                }
            }
            else {
                Messages.AddErrorFlashMessage("Thông báo: Tên đăng nhập \""+user+"\" không tồn tại trong hệ thống");
                Messages.AddErrorFlashMessage("Hoặc tài khoản của bạn chưa được kích hoạt hoặc đang bị khóa");
                Messages.AddErrorFlashMessage("Vui lòng xem lại tên đăng nhập và mật khẩu");
                return Redirect(url);
            }
            
        }
        
        public ActionResult LogOut()
        {
            try
            {
                var temp = new BaseAuthentication();
                temp.Logout();
                Messages.AddFlashMessage("Thông báo: Bạn đã đăng xuất khỏi tài khoản...");
                return RedirectToAction("Index", "Home");
            }
            catch { throw; }
        }

        public ActionResult Register()
        {
            ChoVietDataContext eDataContext = new ChoVietDataContext();
            var param = new UserRegisterViewModel();
            param.Countries = eDataContext.Countries.ToList();
            param.Cities = eDataContext.Cities.OrderBy(e => e.Name).ToList();
            param.District = new List<District>();
            return View(param);
        }
        [HttpPost]
        public ActionResult Register(UserRegisterViewModel fromdata)
        {
            UpdateModel(fromdata);
            ChoVietDataContext eDataContext = new ChoVietDataContext();
            if (eDataContext.Connection.State == System.Data.ConnectionState.Closed) eDataContext.Connection.Open();
            eDataContext.Transaction = eDataContext.Connection.BeginTransaction();
            try
            {
                //Test captchar code
                var basecaptchar  = HttpContext.Session["captchastring"].ToString();
                if (Request["CaptchaText"].ToString() == basecaptchar)
                {
                    var birdthDay = Request["bdtDay"] != null && Request["bdtDay"].ToString() != string.Empty ? Utils.ParseDateTime(Request["bdtDay"].ToString(), new System.Globalization.CultureInfo("vi-VN")) : (DateTime?)null;
                    fromdata.User.BirdthDay = birdthDay;
                    fromdata.User.CreatedDate = DateTime.Now;
                    var randomkey = Utils.RandomString(5);
                    randomkey = randomkey.Trim();
                    var pas = Utils.EncryptToMD5(fromdata.User.PassWord, randomkey);
                    fromdata.User.RandomKey = randomkey;
                    var pasUser = fromdata.User.PassWord;
                    fromdata.User.PassWord = pas;
                    var activeCode = Utils.RandomString(8);
                    activeCode = activeCode.Trim();
                    fromdata.User.ActiveCode = activeCode;
                    eDataContext.Users.InsertOnSubmit(fromdata.User);
                    eDataContext.SubmitChanges();
                    Messages.AddFlashMessage("Thông báo: Bạn đã đăng ký tài khoản thành công!");
                    //Load image avatar;
                    //Image display
                    HttpPostedFileBase fileImage = Request.Files["AdImage"];
                    if (fileImage != null && fileImage.ContentLength > 0)
                    {
                        var tempPath = Utils.ReduceImageSize("\\" + Settings.Default.UserAvataTempAvatarPath + fromdata.User.ID.ToString() + "_" + fileImage.FileName, Settings.Default.SiteRootPath, Convert.ToInt32(Settings.Default.UserAvatarRedureSizePercent), fileImage);
                        // resize image to avatar image;
                        var img = Utils.CreateThumbnail(Settings.Default.SiteRootPath + tempPath.Replace('/', '\\'), Convert.ToInt32(Settings.Default.GenUserAvataWidth), Convert.ToInt32(Settings.Default.GenUserAvataHeight));
                        fromdata.User.AvataPath = Utils.SaveThumbnail(img, Convert.ToInt32(Settings.Default.GenUserAvataWidth), Convert.ToInt32(Settings.Default.GenUserAvataHeight), Settings.Default.UserAvatarPath + fromdata.User.ID + "_" + fileImage.FileName, Settings.Default.SiteRootPath);
                        eDataContext.SubmitChanges();
                        //Delete file template (Tam thoi )
                        //Uploads.DeleteFile(Settings.Default.SiteRootPath + tempPath.Replace('/', '\\'));
                    }
                    // Gửi mail kích hoạt
                    string subject = "Chợ102.vn - Kích hoạt đăng ký thành viên:'" + fromdata.User.UserName + "'";
                    string fromMail = ConfigurationManager.AppSettings["DefaultFromMail"];

                    try
                    {
                        var linkAcv = LinkUtils.domain + "/User/ActiveUser/" + fromdata.User.ID + "?activeCode=" + fromdata.User.ActiveCode;
                        var body = string.Format(MailContent.ActiveUserMailBody, fromdata.User.DisplayName, linkAcv, fromdata.User.UserName, pasUser);
                        SmtpMailer.sendMail(fromdata.User.Email, fromMail, subject, body);
                        Messages.AddFlashMessage("Chúng tôi đã gửi email kích hoạt tài khoản tới địa chỉ mail \"" + fromdata.User.Email + "\"");
                        Messages.AddFlashMessage("Vui lòng check mail để kích hoạt tài khoản");
                        Messages.AddFlashMessage(" Chú ý nếu trong hộp thư đến ko có, bạn vui lòng kiểm tra cả trong thư Spam");
                    }
                    catch
                    {
                        Messages.AddFlashMessage("Tuy nhiên chúng tôi rất tiếc khi Email kích hoạt tài khoản của bạn không được gửi tới địa chỉ email '" + fromdata.User.Email + "'");
                        Messages.AddFlashMessage("Bạn vui lòng gửi mail thông báo về sự cố này vào địa chỉ mail:Contact@cho102.vn");
                        Messages.AddFlashMessage("Hoặc liên hệ trực với hỗ trợ viên theo số: 0986.008.182 or 0974.898.295 để được hỗ trợ");
                    }
                    Messages.AddFlashMessage("Xin cảm ơn bạn đã sử dụng dịch vụ của chúng tôi!");
                    Messages.AddFlashMessage(" Thân ái...Chợ102.vn");
                    eDataContext.Transaction.Commit();
                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    Messages.AddErrorFlashMessage("Mã xác nhận bạn nhập không đúng. Vui lòng nhập");
                    return RedirectToAction("Register", "User");
                }
            }
            catch (Exception exp)
            {
                eDataContext.Transaction.Rollback();
                Messages.AddErrorFlashMessage("Đăng ký tài khoản không thành công. Bạn vui lòng xem xét lại dữ liệu!");
                Messages.AddErrorFlashMessage("Xin cám ơn!");
                return RedirectToAction("Register", "User");
            }
        }

        public ActionResult ActiveUser(int id)
        {
            var activeCode = Request["activeCode"];
            try
            {
                ChoVietDataContext eDataContext = new ChoVietDataContext();
                var curentUser = eDataContext.Users.FirstOrDefault(e => e.ID == id);
                if (curentUser != null && curentUser.ActiveCode == activeCode)
                {
                    curentUser.ActiveYN = true;
                    curentUser.OperationYN = true;
                    eDataContext.SubmitChanges();
                    Messages.AddFlashMessage("Bạn đã kích hoạt tài khoản thành công!");
                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    Messages.AddErrorFlashMessage("Kích hoạt không thành công! Mã kích hoạt không đúng!");
                    return RedirectToAction("Index", "Home");
                }
            }
            catch
            {
                Messages.AddErrorFlashMessage("Thông báo: Kích hoạt tài khoản gặp lỗi");
                Messages.AddErrorFlashMessage(" Vui lòng kích hoạt lại hoặc liên hệ với hỗ trợ viên để được trợ giúp!");
                return RedirectToAction("Index", "Home");
            }
        }

        public ActionResult RePass()
        {
            return View();    
        }

        [HttpPost]
        public ActionResult RePass(string email)
        {
            try
            {
                string reEmail = Request.Form["txtEmail"].ToString();
                ChoVietDataContext eDataContext = new ChoVietDataContext();
                var currentUser = eDataContext.Users.FirstOrDefault(e => e.Email.ToLower() == reEmail.ToLower());
                if (currentUser != null)
                {
                    string body = MyFile.ReadFile("\\EmailTemplates\\RecoverPassword.htm");
                    string curPass = Utils.DecryptFromMD5(currentUser.PassWord, currentUser.RandomKey);
                    // Gửi mail kích hoạt
                    string subject = "Chợ102.vn - Khôi phục lại mật khẩu";
                    string fromMail = ConfigurationManager.AppSettings["DefaultFromMail"];

                    try
                    {

                        var bdy = string.Format(body, currentUser.UserName, curPass);
                        SmtpMailer.sendMail(currentUser.Email, fromMail, subject, bdy);
                        Messages.AddFlashMessage("Chúng tôi đã gửi email khôi phục tài khoản tới địa chỉ mail \"" + currentUser.Email + "\"");
                        Messages.AddFlashMessage("Vui lòng check mail để xem thông tin về tài khoản của bạn");
                        Messages.AddFlashMessage(" Chú ý nếu trong hộp thư đến ko có, bạn vui lòng kiểm tra cả trong thư Spam");
                    }
                    catch (Exception)
                    {
                        Messages.AddErrorFlashMessage("Chúng tôi rất tiếc do sự cố về mạng nên! Email khôi phục tài khoản của bạn không được gửi tới địa chỉ email '" + currentUser.Email + "'");
                        Messages.AddErrorFlashMessage("Bạn vui lòng gửi mail thông báo về sự cố này vào địa chỉ mail:Contact@cho102.vn");
                        Messages.AddErrorFlashMessage("Hoặc liên hệ với hỗ trợ viên theo số: 0986.008.182 để được hỗ trợ");
                        throw new IndexOutOfRangeException();
                    }
                }
                else
                {
                    Messages.AddErrorFlashMessage("Không tồn tại email '" + reEmail + "' trên hệ thống");
                }
                return RedirectToAction("Index", "Home");
            }
            catch(Exception ex) {
                Messages.AddErrorFlashMessage("Gửi email khôi phục mật khẩu không thành công!");
                Messages.AddErrorFlashMessage("Vui lòng thử lại với email chính xác hoặc liên hệ với người trợ giúp để được hướng dẫn.");
                Messages.AddErrorFlashMessage("Xin cám ơn!");
                MyLogfile.WriteLogData("Error", "RePass: " + ex.ToString());
                return View();
            }

        }
    }
}
